#ifndef _NETWORK_BOARD_H_
#define _NETWORK_BOARD_H_

#include <config.h>
#include <stdbool.h>
#include "ml307_app.h"
#include "tp1107_app.h"
#include "rs485_app.h"

#if _NETWOK_FUNCTION_ENABLE_

/* 定义相关功能引脚 */
#if _BOARD_TYPE_ == _V31_A_BOARD_
// 复位管脚
#define NETWORK_DEVICE_RESET_PIN                                 GPIO_Pin_20
// 唤醒管脚
#define NETWORK_DEVICE_IRQN_PIN                                  GPIO_Pin_0
// 模组唤醒管脚
#define NETWORK_DEVICE_WAKEUP_PIN                                GPIO_Pin_21
// 电源控制
#define NETWORK_POWER_CONTORL_PIN                                GPIO_Pin_1
// 模组串口接收
#define NETWORK_UART_RXD_PIN                                     GPIO_Pin_22
// 模组串口发送
#define NETWORK_UART_TXD_PIN                                     GPIO_Pin_23

#elif _BOARD_TYPE_ == _V32_A_BOARD_
// 复位管脚
#define NETWORK_DEVICE_RESET_PIN                                 GPIO_Pin_6
// 唤醒管脚
#define NETWORK_DEVICE_IRQN_PIN                                  GPIO_Pin_1
// 模组唤醒管脚
#define NETWORK_DEVICE_WAKEUP_PIN                                GPIO_Pin_22
// 电源控制
#define NETWORK_POWER_CONTORL_PIN                                GPIO_Pin_0
// 模组串口接收
#define NETWORK_UART_RXD_PIN                                     GPIO_Pin_4
// 模组串口发送
#define NETWORK_UART_TXD_PIN                                     GPIO_Pin_5

#elif _BOARD_TYPE_ == _V32_B_BOARD_
// 模组使能引脚
#define NETWORK_ENABLE_PIN                                       GPIO_Pin_5
// 模组串口接收
#define NETWORK_UART_RXD_PIN                                     GPIO_Pin_4
// 模组串口发送
#define NETWORK_UART_TXD_PIN                                     GPIO_Pin_7

#elif _BOARD_TYPE_ == _V33_A_BOARD_
// 复位管脚
#define NETWORK_DEVICE_RESET_PIN                                 GPIO_Pin_2
// 唤醒管脚
#define NETWORK_DEVICE_IRQN_PIN                                  GPIO_Pin_13
// 模组唤醒管脚
#define NETWORK_DEVICE_WAKEUP_PIN                                GPIO_Pin_1
// 电源控制
#define NETWORK_POWER_CONTORL_PIN                                GPIO_Pin_3
// 模组串口接收
#define NETWORK_UART_RXD_PIN                                     GPIO_Pin_15
// 模组串口发送
#define NETWORK_UART_TXD_PIN                                     GPIO_Pin_14

#elif _BOARD_TYPE_ == _V33_B_BOARD_
// 复位管脚
#define NETWORK_DEVICE_RESET_PIN                                 GPIO_Pin_12
// 唤醒管脚
#define NETWORK_DEVICE_IRQN_PIN                                  GPIO_Pin_14
// 模组唤醒管脚
#define NETWORK_DEVICE_WAKEUP_PIN                                GPIO_Pin_11
// 电源控制
#define NETWORK_POWER_CONTORL_PIN                                GPIO_Pin_13
// 模组串口接收
#define NETWORK_UART_RXD_PIN                                     GPIO_Pin_4
// 模组串口发送
#define NETWORK_UART_TXD_PIN                                     GPIO_Pin_7

#elif _BOARD_TYPE_ == _V33_C_BOARD_
// 复位管脚
#define NETWORK_DEVICE_RESET_PIN                                 GPIO_Pin_20
// 唤醒管脚
#define NETWORK_DEVICE_IRQN_PIN                                  GPIO_Pin_0
// 模组唤醒管脚
#define NETWORK_DEVICE_WAKEUP_PIN                                GPIO_Pin_19
// 电源控制
#define NETWORK_POWER_CONTORL_PIN                                GPIO_Pin_21
// 模组串口接收
#define NETWORK_UART_RXD_PIN                                     GPIO_Pin_22
// 模组串口发送
#define NETWORK_UART_TXD_PIN                                     GPIO_Pin_23
#elif _BOARD_TYPE_ == _EC01_BOARD_//485
// 模组使能引脚
#define NETWORK_ENABLE_PIN                                       GPIO_Pin_9 // PB9
// 模组串口接收
#define NETWORK_UART_RXD_PIN                                     GPIO_Pin_15 // PA15 RX0
// 模组串口发送
#define NETWORK_UART_TXD_PIN                                     GPIO_Pin_14 // PA14 TX0
#endif

// 串口波特率
#if _NETWOK_MODLE_TYPE_ == _TP1107_MODULE_
#define NETWORK_UART_BAUD_RATE                                   (9600ul)
#elif _NETWOK_MODLE_TYPE_ == _RS485_MODULE_
#define NETWORK_UART_BAUD_RATE                                   (38400ul)
#elif _NETWOK_MODLE_TYPE_ == _ML307R_MODLE_
#define NETWORK_UART_BAUD_RATE                                   (115200ul)
#endif

// 收发报文长度
#define NETWORK_MESSAGE_PACKET_LENGTH                            (NOMINAL_PACKET_LENGTH)

// 等待设备就绪时间
#define NETWORK_WAIT_DEVICE_READY_TIME                           (20ul)
// 低电量保护阈值
#define NETWORK_LOW_POWER_PROTECTION_THRESHOLD                   (LOW_BATTERY_ALERT_THRESHOLD)

/**
 * @brief 网络接入状态
 *
 */
typedef enum
{
  NETWORK_NET_NO_USE,         // 不使用
  NETWORK_NET_ACCESSING,      // 正在接入网络
  NETWORK_NET_ACCESS_ERROR,   // 接入失败
  NETWORK_NET_ACCESS_SUCCESS, // 接入成功
} NetworkNetAccessStatus_t;


/**
 * @brief 事件执行状态
 *
 */
typedef enum
{
#if _NETWOK_MODLE_TYPE_ == _TP1107_MODULE_
  NETWORK_MESSAGE_EXECUTE_OVER    = TP1107_EXECUTE_OVER,    // 完毕
  NETWORK_MESSAGE_EXECUTE_WAIT    = TP1107_EXECUTE_WAIT,    // 等待
  NETWORK_MESSAGE_EXECUTE_ERROR   = TP1107_EXECUTE_ERROR,   // 错误
  NETWORK_MESSAGE_EXECUTE_RETRY   = TP1107_EXECUTE_RETRY,   // 重试
  NETWORK_MESSAGE_EXECUTE_SUCCESS = TP1107_EXECUTE_SUCCESS, // 成功

#elif _NETWOK_MODLE_TYPE_ == _ML307R_MODLE_
  NETWORK_MESSAGE_EXECUTE_OVER    = ML307_EXECUTE_OVER,    // 完毕
  NETWORK_MESSAGE_EXECUTE_WAIT    = ML307_EXECUTE_WAIT,    // 等待
  NETWORK_MESSAGE_EXECUTE_ERROR   = ML307_EXECUTE_ERROR,   // 错误
  NETWORK_MESSAGE_EXECUTE_RETRY   = ML307_EXECUTE_RETRY,   // 重试
  NETWORK_MESSAGE_EXECUTE_SUCCESS = ML307_EXECUTE_SUCCESS, // 成功
#else
  NETWORK_MESSAGE_EXECUTE_OVER = RS485_EXECUTE_OVER,    // 完毕
  NETWORK_MESSAGE_EXECUTE_WAIT = RS485_EXECUTE_WAIT,    // 等待
  NETWORK_MESSAGE_EXECUTE_ERROR = RS485_EXECUTE_ERROR,   // 错误
  NETWORK_MESSAGE_EXECUTE_RETRY = RS485_EXECUTE_RETRY,   // 重试
  NETWORK_MESSAGE_EXECUTE_SUCCESS = RS485_EXECUTE_SUCCESS, // 成功
#endif
} NetworkExecuteResult_t;

  // RS485_EXECUTE_OVER,    // 完毕 Network
  // RS485_EXECUTE_WAIT,    // 等待
  // RS485_EXECUTE_ERROR,   // 错误
  // RS485_EXECUTE_RETRY,   // 重试
  // RS485_EXECUTE_SUCCESS, // 成功

/**
 * @brief 应答报文类型
 *
 */
typedef enum
{
#if _NETWOK_MODLE_TYPE_ == _TP1107_MODULE_
  NETWORK_RESPOND_AT         = TP1107_RESPOND_AT,         // AT命令应答
  NETWORK_RESPOND_HOST       = TP1107_RESPOND_HOST,       // 主机推送
  NETWORK_RESPOND_ERROR      = TP1107_RESPOND_ERROR,      // 错误提示
  NETWORK_RESPOND_DEV_STATE  = TP1107_RESPOND_DEV_STATE,  // 设备状态
  NETWORK_RESPOND_DISCONNECT = TP1107_RESPOND_DISCONNECT, // 与服务器断开连接

#elif _NETWOK_MODLE_TYPE_ == _ML307R_MODLE_
  NETWORK_RESPOND_AT         = ML307_RESPOND_AT,         // AT命令应答
  NETWORK_RESPOND_HOST       = ML307_RESPOND_HOST,       // 主机推送
  NETWORK_RESPOND_ERROR      = ML307_RESPOND_ERROR,      // 错误提示
  NETWORK_RESPOND_DEV_STATE  = ML307_RESPOND_DEV_STATE,  // 设备状态
  NETWORK_RESPOND_DISCONNECT = ML307_RESPOND_DISCONNECT, // 与服务器断开连接

#else
  NETWORK_RESPOND_AT,         // AT命令应答
  NETWORK_RESPOND_HOST,       // 主机推送
  NETWORK_RESPOND_ERROR,      // 错误提示
  NETWORK_RESPOND_DEV_STATE,  // 设备状态
  NETWORK_RESPOND_DISCONNECT, // 与服务器断开连接
#endif
} NetworkMessageType_t;

/**
 * @brief 事件服务类型
 *
 */
typedef enum
{
  NETWORK_COMMAND_OPERATION = 1 << 0, // 数据操作
} NetworkEventTask_t;

// 串口接收完毕
typedef void (*NetworkUartRxDone_t)(void);
// 数据操作
typedef void (*NetworkCommandOperation_t)(void);
// 网络保活超时
typedef void (*NetworkKeepAliveTimeout_t)(void);
// 空中唤醒
typedef void (*NetworkAirborneAwakening_t)(void);

// 报文解析
typedef uint8_t (*NetworkMessageParsing_t)(const void *);
typedef uint8_t (*NetworkMessageParsingByParm_t)(const void *, uint16_t);
// 报文构建
typedef bool (*NetworkMessageBuildToSending_t)(uint8_t *, uint16_t *, uint32_t *);
typedef bool (*NetworkMessageBuildToSendingByParm_t)(void *, uint8_t *, uint16_t *, uint32_t *);

/**
 * @brief 收发数据包
 *
 */
typedef struct
{
  uint16_t DataSize;                               // 数据长度
  uint8_t DataBuff[NETWORK_MESSAGE_PACKET_LENGTH]; // 收发数据流
} NetworkDataPacket_t;

/**
 * @brief 命令接口表
 *
 */
typedef struct
{
  NetworkMessageParsing_t Parsing;        // 解析方法
  NetworkMessageBuildToSending_t Sending; // 发送发送
} NetworkCommandApiTable_t;

/**
 * @brief 命令接口表
 *
 */
typedef struct
{
  NetworkMessageParsingByParm_t Parsing;        // 解析方法
  NetworkMessageBuildToSendingByParm_t Sending; // 发送发送
} NetworkCommandApiTableTwo_t;
/**
 * @brief 无线任务相关接口
 *
 */
typedef struct
{
  NetworkCommandApiTable_t SelfTestCallback;                   // 自检服务
  NetworkCommandApiTable_t ResetSystemStatusCallback;          // 重置无线功能服务
  NetworkCommandApiTable_t ForceExitCommandModeCallback;       // 强制退出命令模式
  NetworkCommandApiTable_t InitiateNetAttachmentCallback;      // 启动网络附着服务
  NetworkCommandApiTableTwo_t OpenSpecificFloorCallback;       // 打开指定楼层
  NetworkCommandApiTableTwo_t ElevatorIoBoardFirmwareTransCallback;    // 梯控io板固件传输
  NetworkCommandApiTableTwo_t ElevatorIoBoardQueryOtaStatusCallback;    // 梯控io板查询固件升级状态
  NetworkCommandApiTableTwo_t GetVersionCallback;    // 获取版本号
  NetworkCommandApiTableTwo_t OpenEmergencyModeCallback;    // 开启紧急模式
  NetworkCommandApiTableTwo_t QueryIoBoardMacAddressCallback;    // 查询io板mac地址
  NetworkCommandApiTableTwo_t SetBoardSelfTestModeCallback;    // 设置板自测试模式
} NetworkTaskApi_t;

/**
 * @brief 外部调用方法
 *
 */
typedef struct
{
  NetworkUartRxDone_t UartRxDoneCallBack;               // 串口接收完毕回调
  NetworkCommandOperation_t CommandOperationCallback;   // 命令操作回调
  NetworkAirborneAwakening_t AirborneAwakeningCallback; // 空中唤醒回调
} NetworkExternFunctionTable_t;

/**
 * @brief 毫秒延时函数
 *
 * @param Ms - 毫秒延时
 */
extern void NetworkDelayMs(uint16_t Ms);

/**
 * @brief 设置网络模组复位管脚电平
 *
 * @param PinLevel - 管脚电平（true：高电平 false：低电平）
 */
extern void NetworkSetResetPinLevel(bool PinLevel);

/**
 * @brief 设置网络模组唤醒管脚电平
 *
 * @param PinLevel - 管脚电平（true：高电平 false：低电平）
 */
extern void NetworkSetWakeupPinLevel(bool PinLevel);

/**
 * @brief 设置电源控制管脚电平
 *
 * @param PinLevel - 管脚电平（true：高电平 false：低电平）
 */
extern void NetworkSetPowerControlPinLevel(bool PinLevel);

/**
 * @brief 设置发送使能管脚电平
 *
 * @param PinLevel - 管脚电平（true：高电平 false：低电平）
 */
extern void NetworkSetSendEnablePinLevel(bool PinLevel);

/**
 * @brief 获取网络模组中断管脚电平
 *
 * @return bool - 管脚电平（true：高电平 false：低电平）
 */
extern bool NetworkGetIrqnPinLevel(void);

/**
 * @brief 使能管脚中断
 *
 */
extern void NetworkEnableInterrupts(void);

/**
 * @brief 失能管脚中断
 *
 */
extern void NetworkDisableInterrupts(void);

/**
 * @brief 硬件复位
 *
 */
extern void NetworkHardwareReset(void);

/**
 * @brief 通过串口向网络模组发送一定数据长度的数据
 *
 * @param pDataIn - 待发送的数据流
 * @param SizeIn  - 发送数据长度
 * @return bool   - 发送状态（true：成功 false：失败）
 */
extern bool NetworkUartSendData(const uint8_t *pDataIn, uint16_t SizeIn);

/**
 * @brief 验证报文类型
 *
 * @param pDataIn  - 待验证的数据流
 * @param DataSize - 待验证的数据流的长度
 * @return uint8_t - 报文类型
 */
extern uint8_t NetworkAuthenticationMessageType(const void *pDataIn, uint16_t DataSize);

/**
 * @brief 启动数据传输
 *
 */
extern void NetworkInitiateDataTransfer(void);

/**
 * @brief 过滤关键词
 *
 * @param pMessagePacket - 报文
 * @param pMessageSize   - 报文长度
 */
extern void NetworkDetermineIfKeyword(const void *pMessagePacket, uint16_t *pMessageSize);

/**
 * @brief 向服务器发送一点长度的数据
 *
 * @param pDataIn   - 待发送的数据
 * @param DataSize  - 待发送数据长度
 */
extern void NetWorkSendDataToHost(const uint8_t *pDataIn, uint16_t DataSize);

/**
 * @brief 转发接收到的数据
 *
 * @param pMessagePacket - 接收的报文
 * @param MessageSize    - 报文数据长度
 */
extern void NetworkForwardIncomingData(const uint8_t *pMessagePacket, uint16_t MessageSize);

/**
 * @brief 告知自检结果
 *
 * @param Result - 结果（true：成功 false：失败）
 */
extern void NetworkNotificationSelfTestResult(bool Result);

/**
 * @brief 告知网络附着状态
 *
 * @param AccessStatus - 网络接入状态
 */
extern void NetworkNotificationNetworkAttachmentResult(NetworkNetAccessStatus_t AccessStatus);

/**
 * @brief 告知重置结果
 *
 * @param Result - 结果（true：成功 false：失败）
 */
extern void NetworkNotificationResetResults(bool Result);

/**
 * @brief 通讯已断开
 *
 */
extern void NetworkCommunicationHasBeenDisconnected(void);

/**
 * @brief 获取网络附着状态
 *
 * @return bool - 附着状态（true：成功 false：失败）
 */
extern bool NetworkGetAttachmentStatus(void);

/**
 * @brief 判断是否支持远程唤醒
 *
 * @return bool - 支持远程唤醒（true：支持 false：不支持）
 */
extern bool NetworkDetermineIfRemoteWakeupIsSupported(void);

/**
 * @brief 启动网络保活
 *
 */
extern void NetworkStartKeepAlive(void);

/**
 * @brief 判断电量是否在允许范围
 *
 * @return bool - 判断结果（true：支持 false：不支持）
 */
extern bool NetworkDetermineIfThePowerIsWithinTheAllowableRange(void);

/**
 * @brief 停止命令操作任务
 *
 */
extern void NetworkStopCommandOperationTask(void);

/**
 * @brief 延时启动命令操作任务
 *
 * @param Ms - 延时的时间
 */
extern void NetworkDelayedStartCommandOperationTask(uint32_t Ms);

/**
 * @brief 立即启动命令操作任务
 *
 */
extern void NetworkStartCommandOperationTaskNoWait(void);

/**
 * @brief 配置低功耗模式
 *
 */
extern void NetworkConfigurationLowPower(void);

/**
 * @brief 配置为正常模式
 *
 */
extern void NetworkConfigurationNormalMode(void);

/**
 * @brief 板载功能初始化
 *
 * @param pTaskApiOut       - 事件接口
 * @param pExternFunctionIn - 外部调用方法
 * @param pDataPacketIn     - 数据收发缓存区
 */
extern void NetworkBoardBoardInitialisation(NetworkTaskApi_t *pTaskApiOut, NetworkExternFunctionTable_t *pExternFunctionIn, NetworkDataPacket_t *pDataPacketIn);

#endif
#endif
